package dao;

import java.util.ArrayList;
import java.util.List;

import hbt.HibernateUtil;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class HibernateDAO {
	
	private static HibernateDAO instancia;
	
	private HibernateDAO(){}
	
	public static HibernateDAO getInstancia()
	{
		if(instancia == null)
			instancia = new HibernateDAO();
		return instancia;
	}
	
//	public float totalPorCliente(dto.Cliente cliente)
//	{
//		SessionFactory sf =  HibernateUtil.getSessionFactory();
//		Session session = sf.getCurrentSession();
//		org.hibernate.Transaction t =  session.beginTransaction();
//		Double resultado = (Double)session.createQuery("select sum(i.cantidad *  i.precio) as importe from Pedido p inner join p.items i where p.cliente.codigo = :codigoCliente").setInteger("codigoCliente", cliente.getCodigo()).uniqueResult();
//		Float r = Float.valueOf(String.valueOf(resultado));
//		t.commit();
//		session = null;
//		return r;
//	}
//	
//	public List<dto.Pedido> pedidoConNacionales()
//	{
//		SessionFactory sf =  HibernateUtil.getSessionFactory();
//		Session session = sf.getCurrentSession();
//		org.hibernate.Transaction t =  session.beginTransaction();
//		List<entity.Pedido> res = session.createQuery("from Pedido p inner join p.items i inner join i.identificador.articulo a where a.id in (select x.id from Nacional x) ").list();
//		List<dto.Pedido> resultado = new ArrayList<dto.Pedido>();
//		for(entity.Pedido p : res)
//		{
//			dto.Pedido aux = new dto.Pedido();
//			dto.Cliente auxC = new dto.Cliente();
//			auxC.setCodigo(p.getCliente().getCodigo());
//			auxC.setCategoria(p.getCliente().getCategoria());
//			auxC.setNombre(p.getCliente().getNombre());
//			auxC.setPedidos(null);
//			aux.setCliente(auxC);
//			aux.setFecha(p.getFecha());
//			aux.setNumero(p.getNumero());
//			resultado.add(aux);
//		}
//		t.commit();
//		session = null;
//		System.out.println("Lista de Pedidos "+res.size());
//		return resultado;
//	}
// 	public void grabarOrden(OrdenDeCompraBean o) {
//		Session session=sf.openSession();
//		session.beginTransaction();
//		session.persist(o);
//		session.flush();
//		session.getTransaction().commit();
//		session.close();
// 	}
//
// 
// 	public int obtenerTotalOrden(int numeroOrden) {
// 		int cantidad=0;
// 		Session ss = sf.openSession();
// 
// 		@SuppressWarnings("unchecked")
// 		List<Object[]> lista = ss.createQuery(
// 				"select o, i, m  from ordenDeCompraBean as o inner join o.items  as i inner join i.material as m where as.numero= :num")
// 				.setString(numeroOrden,":num").list();
// 		for (Object[] item : lista) {
// 			MaterialBean mater = (MaterialBean)item[3];
// 			List<PrecioBean> precios = mater.getPrecios();
// 			for (PrecioBean itemP : precios) {
// 				cantidad = cantidad + (int)itemP.getPrecio();
// 			}
// 
// 		}		
// 		return cantidad;
// 	}
// }
// Obtener el importe a pagar para un bien pasado como parametro. El valor del impuesto se calcula como el 
// 	 valor del bien, multiplicado por el porcentaje del impuesto y se le suma la base si el impuesto es inmobiliario. 
// 	 Si el impuesto es automotor, hay que verificar que este vigente, si esta vencido el valor del impuesto es cero.*/
// 	
// 	public double obtenerImporteApagar (String registro){
// 		double importe=0;
// 		Session session = sf.openSession();
// 		try{
// 			importe = (double) session.createQuery("SELECT SUM ((b.valor * b.impuesto.porcentaje) + b.impuesto.base) FROM Bien b WHERE b.impuesto.class IN Automotor and b.registro =:registro ").setParameter("registro", BienDTO.getRegistro());
// 		}catch(Exception e){
// 			e.printStackTrace();			
// 		}
// 		return importe;		
// 	}
//	Determine la cantidad de dinero a recaudar en impuesto para los inmuebles.
// 	public List<NetoInmobiliarioDTO> netoAPagar(){
// 		
// 		Session session = sf.openSession();
// 		List<NetoInmobiliarioDTO> inmobiliarios = new ArrayList<NetoInmobiliarioDTO>();
// 		try{
// 			inmobiliarios = (List<NetoInmobiliarioDTO>)session.createQuery("SELECT new DTO.NetoInmobiliarioDTO (SUM (b.valor * b.impuesto.base), b.impuesto.partida FROM Bien b  group by b.registro").list();
// 		
// 		}catch(Exception e){
// 			e.printStackTrace();			
// 		}
// 		return inmobiliarios;		
// 	}
//
//	public void grabarFactura(Factura x){
//		Session session=sf.openSession();
//		session.beginTransaction();
//		session.persist(x);
//		session.flush();
//		session.getTransaction().commit();
//		session.close();
//	}
//	
//	public void updateFactura(Factura x){
//		Session session=sf.openSession();
//		session.beginTransaction();
//		session.saveOrUpdate(x);
//		session.flush();
//		session.getTransaction().commit();
//		session.close();
//	}
//	
//	public void eliminarFactura(Factura x){
//		Session session=sf.openSession();
//		session.beginTransaction();
//		session.delete(x);
//		session.flush();
//		session.getTransaction().commit();
//		session.close();
//	}
//	
//	public Factura buscarFactura(Factura d){
//		Session session=sf.openSession();
//		session.beginTransaction();
//		d=(Factura) session.get(Factura.class, d.getNumero());
//		session.flush();
//		session.getTransaction().commit();
//		session.close();
//		return d;
//	}
//	@SuppressWarnings("unchecked")
//	public List<Factura> buscarFacturas(){
//		Session session=sf.openSession();
//		return (List<Factura>)session.createQuery("from Factura").list();
//	}
//
//	@SuppressWarnings("unchecked")
//	public List<Object[]> netoFacturadoPorTipoMesa() {
//		Session session=sf.openSession();
//		List<Object[]>list=(List<Object[]>) session.createQuery("select m.descripcion,sum(f.total) from Factura f join f.mesa m group by m.descripcion,f.total").list();
//		return list;
//	}
//
//	@SuppressWarnings("unchecked")
//	public List<Factura> buscarFacturasPorPlato(Plato plato) {
//		Session session=sf.openSession();
//		List<Factura>facturas=(List<Factura>)session.createQuery("select f.* from Factura f join f.platos p where p.id=?").setInteger(0, plato.getId()).list();
//		return facturas;
//	}

}

